iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
自我挑戰組

解三十天的 CodeWars系列 第 18

Strip Comments

  • 分享至 

  • xImage
  •  

CodeWars 題目

Link

難度

4 kyu

題目

傳入兩個參數,input 為字串、markers 為陣列形式;
按照陣列裡的字元符號,移除 input 同樣符號與它後面的字元、行尾的空白,最後輸出結果。

例如:

apples, pears # and bananas
grapes
bananas !apples

移除 # ! 之後的字元

apples, pears
grapes
bananas

思路

利用 filter 過濾字元,判斷 markers 裡的符號要移除、\n 要保留。

loop 跑迴圈,如果迭代的字元可在 markers 找到。
刪除模式,將這次開始的每一個元素都移除;直到找到 \n,開始保留模式,將每個元素保留。

pseudo code

input.split("").filter(item=>{
  let isClear = false <-- 紀錄是否要保留
  if(markers.includes(item)) isClear = true
  if(item === \n) isClear = false
  
  if(isClear) return false    
  if(!isClear) return true
})

實作

function solution(input, markers) {
   let isClear = false;
   let workArr = input.split("\n");
   for (let i = 0; i < workArr.length; i++) {
      isClear = false;
      workArr[i] = workArr[i].split("").filter((item) => {
         if (markers.includes(item)) isClear = true;
         if (item === "\n") isClear = false;
         return !isClear;
      }).join("").trim();
   }
   return workArr.join("\n");
};

isClear 用來記錄目前是刪除還是保留狀態;

workArr 將 input 參數以換行符號為界線切割成陣列,並且進入 for 迴圈。
在迴圈中,isClear 會被重新 = false,避免上一輪的變化影響。

workArr 再拆解成單一字元,並且用 filter 過濾;markers.includes(item) 判斷如果能在 markers 找到,表示必須開始由此清除,isClear 將被改為 = true;如果是換行符號,表示由此開始要保留;isClear = false。

filter 會把條件判斷為 true 的元素留下、false 則移除;因此直接返回 !isClear。
最後把單一字元陣列轉為字串後,再去掉頭尾的空格;再把一元陣列轉為字串,用換行符號拼接即可。

心得

其實最一開始解這題目用了兩層 for 迴圈⋯⋯
不過在演算法中這時間複雜度太差,還是重新想了一次。


上一篇
Beeramid
下一篇
Product of consecutive Fib numbers
系列文
解三十天的 CodeWars30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言